package dao;
     /**
     * Responsavel por realizar transações com o BD
     *
     */
import classes.Unidade;
import conexao.GerenciadorConexao;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.DaoException;
import erro.GeralException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DaoUnidade implements IDaoUnidade {
     private GerenciadorConexao g;

    public DaoUnidade() {
        g = GerenciadorConexao.getInstancia();
    }
   
    
    /**
     * Insere um novo registro no BD
     * @param uni
     * @throws GeralException
     * @throws ConexaoException
     * @throws ConsultaException
     * @throws  SQLException
     */

    @Override
    public void inserir(Unidade uni) throws ConexaoException,DaoException{
        String sql = "INSERT INTO unidade (nomeunidade) VALUES (?)";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, uni.getNomeUnidade());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
            }
    }
    /**
     * Altera um registro no BD
     * @param uni
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
    public void alterar(Unidade uni) throws ConexaoException, DaoException {

        String sql = "UPDATE unidade SET nomeunidade=? where codunidade=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setString(1, uni.getNomeUnidade());
            pstm.setInt(2, uni.getCodUnidade());
            pstm.executeUpdate();
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }
    /**
     * Exclui um registro no BD
     * @param uni
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
    public void deletar(Unidade uni) throws ConexaoException, DaoException {

        String sql = "DELETE FROM unidade where codunidade=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            pstm.setInt(1, uni.getCodUnidade());
            pstm.executeUpdate();

        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
    }
        /**
     * Faz pesquisa no BD
     * @param uni
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    @Override
 public Unidade pesquisar(Unidade uni) throws ConexaoException, DaoException {
        String sql = "SELECT * FROM Unidade where nomeunidade=?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, uni.getNomeUnidade());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                uni.setCodUnidade(rs.getInt("codunidade"));
                uni.setNomeUnidade(rs.getString("nomeunidade"));
            }
        } catch (SQLException ex) {
            throw new DaoException();
        } finally {
            g.disconnect();
        }
        return uni;
    }
 
    @Override
     public List<Unidade> pesquisarUni(Unidade uni) throws ConexaoException, ConsultaException {
        List<Unidade> lista = new ArrayList<Unidade>();
        String sql = "SELECT *FROM unidade WHERE nomeunidade like ?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setString(1, uni.getNomeUnidade());
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                uni = new Unidade();
                uni.setCodUnidade(rs.getInt("codunidade"));
                uni.setNomeUnidade(rs.getString("nomeunidade"));
                lista.add(uni);
            }
        } catch (SQLException ex) {
            throw new ConexaoException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
    
    
    @Override
  public List<Unidade> listar() throws ConexaoException, ConsultaException {
        List<Unidade> lista = new ArrayList<Unidade>();
        Unidade uni;
        String sql = "SELECT * FROM Unidade order by nomeunidade";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);
            while (rs.next()) {
                uni = new Unidade();
                uni.setCodUnidade(rs.getInt("codunidade"));
                uni.setNomeUnidade(rs.getString("nomeunidade"));
                lista.add(uni);
            }
        } catch (SQLException ex) {
            throw new ConsultaException();
        } finally {
            g.disconnect();
        }
        return lista;
    }
}
